<?php

require_once __DIR__ . '/../vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

/*
工作队列模式
    工作队列是说有一个生产者发送消息给队列，而可能有一个或多个消费者等待从队列接受并处理消息
    
    循环调度
        当有多个消费者时，队列循环发送消息给每一个消费者，默认情况下，rabbitmq会按顺序发送一条消息给下一个消费者，平均每个消费者会受到相同数量的消息
    消息确认
        消息确认是防止消息丢失，一个确认信息会从消费者返回，告诉rabbitMQ该消费已经收到处理，这时rabbitMQ彩绘释放删除消息，默认情况下消息确认是被关闭的，设置basic_consume()的第四个参数为false，却从消费者发送一个确认即可
    消息持久化
        要确保消息不丢失我们需要标识队列和消息都是可持久的，首先要确保rabbitMQ不会丢失队列，我们需要声明队列为可持久化的，这路设置queue_declare的第三个参数为true即可
        其次我门需要通过delivery_mode=2参数标记消息是持久化的如$msg = new AMQPMessage($data,array('delivery_mode' => 2));
    公平调度
        循环调度容易造成奇偶消费者闲忙不等的清卡情况，为了公平调度我们可以使用basic_qos方法，同时设置参数prefetch=1,如$channel->basic_qos(null, 1, null);
*/

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('demo2', false, false, false, false);
$channel->basic_qos(null, 1, null);
echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

$callback = function ($msg) {
    sleep(2);
    echo " 读取队列参数为： ", $msg->body, "\n";
};


$channel->basic_consume('demo2', '', false, false, false, false, $callback);

while (count($channel->callbacks)) {
   
    $channel->wait();
}
